//
//  BaseModel.m
//  yunqiphone
//
//  Created by Maple on 13-7-1.
//  Copyright (c) 2013年 ci123.com. All rights reserved.
//

#import "BaseModel.h"

@implementation BaseModel

-(id)initWithDataDic:(NSDictionary*)data{
  if (self = [super init]) {
    [self setAttributes:data];
  }
  return self;
}

-(NSDictionary*)attributeMapDictionary{
  return nil;
}

-(SEL)getSetterSelWithAttibuteName:(NSString*)attributeName{
  NSString *capital = [[attributeName substringToIndex:1] uppercaseString];
  NSString *setterSelStr = [NSString stringWithFormat:@"set%@%@:",capital,[attributeName substringFromIndex:1]];
  return NSSelectorFromString(setterSelStr);
}
- (NSString *)customDescription{
  return nil;
}

- (NSString *)description{
  NSMutableString *attrsDesc = [NSMutableString stringWithCapacity:100];
  NSDictionary *attrMapDic = [self attributeMapDictionary];
  NSEnumerator *keyEnum = [attrMapDic keyEnumerator];
  id attributeName;
  
  while ((attributeName = [keyEnum nextObject])) {
    SEL getSel = NSSelectorFromString(attributeName);
    if ([self respondsToSelector:getSel]) {
      NSMethodSignature *signature = nil;
      signature = [self methodSignatureForSelector:getSel];
      NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
      [invocation setTarget:self];
      [invocation setSelector:getSel];
      NSObject *valueObj = nil;
      [invocation invoke];
      [invocation getReturnValue:&valueObj];
      //            ITTDINFO(@"attributeName %@ value %@", attributeName, valueObj);
      if (valueObj) {
        [attrsDesc appendFormat:@" [%@=%@] ",attributeName, valueObj];
        //[valueObj release];
      }else {
        [attrsDesc appendFormat:@" [%@=nil] ",attributeName];
      }
      
    }
  }
  
  NSString *customDesc = [self customDescription];
  NSString *desc;
  
  if (customDesc && [customDesc length] > 0 ) {
    desc = [NSString stringWithFormat:@"%@:{%@,%@}",[self class],attrsDesc,customDesc];
  }else {
    desc = [NSString stringWithFormat:@"%@:{%@}",[self class],attrsDesc];
  }
  
  return desc;
}
-(void)setAttributes:(NSDictionary*)dataDic{
  NSDictionary *attrMapDic = [self attributeMapDictionary];
  if (attrMapDic == nil) {
    NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:[dataDic count]];
    for (NSString *key in dataDic) {
      [dic setValue:key forKey:key];
      attrMapDic = dic;
    }
  }
  NSEnumerator *keyEnum = [attrMapDic keyEnumerator];
  id attributeName;
  while ((attributeName = [keyEnum nextObject])) {
    SEL sel = [self getSetterSelWithAttibuteName:attributeName];
    if ([self respondsToSelector:sel]) {
      NSString *dataDicKey = [attrMapDic objectForKey:attributeName];
      id attributeValue = [dataDic objectForKey:dataDicKey];
      
      //            if (attributeValue == nil) {
      //                if ([attributeName isEqualToString:@"body"]) {
      //                    continue;
      //                }
      //                attributeValue = @"";
      //            }
      
      [self performSelectorOnMainThread:sel
                             withObject:attributeValue
                          waitUntilDone:[NSThread isMainThread]];
    }
  }
}
- (id)initWithCoder:(NSCoder *)decoder{
  if( self = [super init] ){
    NSDictionary *attrMapDic = [self attributeMapDictionary];
    if (attrMapDic == nil) {
      return self;
    }
    NSEnumerator *keyEnum = [attrMapDic keyEnumerator];
    id attributeName;
    while ((attributeName = [keyEnum nextObject])) {
      SEL sel = [self getSetterSelWithAttibuteName:attributeName];
      if ([self respondsToSelector:sel]) {
        id obj = [decoder decodeObjectForKey:attributeName];
        [self performSelectorOnMainThread:sel
                               withObject:obj
                            waitUntilDone:[NSThread isMainThread]];
      }
    }
  }
  return self;
}
- (void)encodeWithCoder:(NSCoder *)encoder{
  NSDictionary *attrMapDic = [self attributeMapDictionary];
  if (attrMapDic == nil) {
    return;
  }
  NSEnumerator *keyEnum = [attrMapDic keyEnumerator];
  id attributeName;
  while ((attributeName = [keyEnum nextObject])) {
    SEL getSel = NSSelectorFromString(attributeName);
    if ([self respondsToSelector:getSel]) {
      NSMethodSignature *signature = nil;
      signature = [self methodSignatureForSelector:getSel];
      NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
      [invocation setTarget:self];
      [invocation setSelector:getSel];
      NSObject *valueObj = nil;
      [invocation invoke];
      [invocation getReturnValue:&valueObj];
      
      if (valueObj) {
        [encoder encodeObject:valueObj forKey:attributeName];
      }
    }
  }
}
- (NSData*)getArchivedData{
  return [NSKeyedArchiver archivedDataWithRootObject:self];
}

- (NSString *)cleanString:(NSString *)str {
  if (str == nil) {
    return @"";
  }
  NSMutableString *cleanString = [NSMutableString stringWithString:str];
  [cleanString replaceOccurrencesOfString:@"\n" withString:@""
                                  options:NSCaseInsensitiveSearch
                                    range:NSMakeRange(0, [cleanString length])];
  [cleanString replaceOccurrencesOfString:@"\r" withString:@""
                                  options:NSCaseInsensitiveSearch
                                    range:NSMakeRange(0, [cleanString length])];
  return cleanString;
}

#ifdef _FOR_DEBUG_
-(BOOL) respondsToSelector:(SEL)aSelector {
  //    printf("SELECTOR: %s\n", [NSStringFromSelector(aSelector) UTF8String]);  
  return [super respondsToSelector:aSelector];  
}  
#endif

@end
